<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
                      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
    <title>Scripts de Visualiza&ccedil;&atilde;o - Zend Framework Manual</title>

    <link href="../css/shCore.css" rel="stylesheet" type="text/css" />
    <link href="../css/shThemeDefault.css" rel="stylesheet" type="text/css" />
    <link href="../css/styles.css" media="all" rel="stylesheet" type="text/css" />
</head>
<body>
<h1>Zend Framework</h1>
<h2>Programmer's Reference Guide</h2>
<ul>
    <li><a href="../en/zend.view.scripts.html">Inglês (English)</a></li>
    <li><a href="../pt-br/zend.view.scripts.html">Português Brasileiro (Brazilian Portuguese)</a></li>
</ul>
<table width="100%">
    <tr valign="top">
        <td width="85%">
            <table width="100%">
                <tr>
                    <td width="25%" style="text-align: left;">
                    <a href="zend.view.controllers.html">Scripts Controladores</a>
                    </td>

                    <td width="50%" style="text-align: center;">
                        <div class="up"><span class="up"><a href="zend.view.html">Zend_View</a></span><br />
                        <span class="home"><a href="manual.html">Guia de Refer&ecirc;ncia do Programador</a></span></div>
                    </td>

                    <td width="25%" style="text-align: right;">
                        <div class="next" style="text-align: right; float: right;"><a href="zend.view.helpers.html">Assistentes de Visualiza&ccedil;&atilde;o</a></div>
                    </td>
                </tr>
            </table>
<hr />
<div id="zend.view.scripts" class="section"><div class="info"><h1 class="title">Scripts de Visualização</h1></div>
    

    <p class="para">
        Uma vez que seu controlador tenha atribuido as variáveis e chamado o método
         <span class="methodname">render()</span>, <span class="classname">Zend_View</span> incluirá o script de
        visualização requerido e o executará &quot;dentro&quot; do escopo da instância de
        <span class="classname">Zend_View</span>. Portanto, em seus scripts de visualização, as referências
        a $this apontarão para a própria instância de <span class="classname">Zend_View</span>.
    </p>

    <p class="para">
        Variáveis atribuídas à visualização pelo controlador são referidas como propriedades de
        instância. Por exemplo, se o controlador atribuir a variável &#039;algumacoisa&#039;, você deve
        referir-se a ela como $this-&gt;algumacoisa em seu script de visualização. (Isto permite um
        rastreamento dos valores que foram atribuidos ao script, e que são internos ao mesmo).
    </p>

    <p class="para">
        A fim de lembrar, aqui está um exemplo de script de visualização originado da introdução do
        <span class="classname">Zend_View</span>.
    </p>

    <pre class="programlisting brush: php">
&lt;?php if ($this-&gt;books): ?&gt;

    &lt;!-- Uma tabela contendo alguns livros. --&gt;
    &lt;table&gt;
        &lt;tr&gt;
            &lt;th&gt;Autor&lt;/th&gt;
            &lt;th&gt;Título&lt;/th&gt;
        &lt;/tr&gt;

        &lt;?php foreach ($this-&gt;books as $key =&gt; $val): ?&gt;
        &lt;tr&gt;
            &lt;td&gt;&lt;?php echo $this-&gt;escape($val[&#039;author&#039;]) ?&gt;&lt;/td&gt;
            &lt;td&gt;&lt;?php echo $this-&gt;escape($val[&#039;title&#039;]) ?&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;?php endforeach; ?&gt;

    &lt;/table&gt;

&lt;?php else: ?&gt;

    &lt;p&gt;Não existem livros a serem exibidos.&lt;/p&gt;

&lt;?php endif;?&gt;
</pre>


    <div class="section" id="zend.view.scripts.escaping"><div class="info"><h1 class="title">Escapando a Saída</h1></div>
        

        <p class="para">
            Uma das tarefas mais importantes a ser executada por scripts de visualização é assegurar
            que a saída seja corretamente escapada; entre outras coisas, isto ajuda a evitar ataques
            do tipo site-cruzado. A menos que você esteja usando uma função, método, ou assistente
            que realize o escape, você sempre deverá escapar o conteúdo das variáveis antes de
            exibí-lo.
        </p>

        <p class="para">
            <span class="classname">Zend_View</span> implementa um método chamado escape() que realiza
            corretamente o escape para você.
        </p>

        <pre class="programlisting brush: php">
// maneira ruim:
echo $this-&gt;variable;

// maneira recomendada:
echo $this-&gt;escape($this-&gt;variable);
</pre>


        <p class="para">
            Por padrão, o método escape() usa a função htmlspecialchars() do <acronym class="acronym">PHP</acronym>
            para fazer o escape. Mas, dependendo do seu ambiente, você pode desejar um comportamento
            diferente para o escape. Use o método setEscape() no nível do controlador para instruir
            o <span class="classname">Zend_View</span> sobre qual função de callback utilizar para fazer o
            escape.
        </p>

        <pre class="programlisting brush: php">
// cria uma instância de Zend_View
$view = new Zend_View();

// instrui o uso de htmlentities como método de escape
$view-&gt;setEscape(&#039;htmlentities&#039;);

// ou instrui o uso de um método estático de classe
$view-&gt;setEscape(array(&#039;SomeClass&#039;, &#039;methodName&#039;));

// ou mesmo um método de instância
$obj = new SomeClass();
$view-&gt;setEscape(array($obj, &#039;methodName&#039;));

// e renderiza a visualização
echo $view-&gt;render(...);
</pre>


        <p class="para">
            A função ou método de callback deverá tomar o valor a ser escapado como seu primeiro
            parâmetro, e os demais parâmetros deverão ser opcionais.
        </p>
    </div>

    <div class="section" id="zend.view.scripts.templates"><div class="info"><h1 class="title">Usando Sistemas de Template Alternativos</h1></div>
        

        <p class="para">
            Embora o <acronym class="acronym">PHP</acronym> em si seja um poderoso sistema de template, muitos
            desenvolvedores sentiram que ele é muito potente ou complexo para seus designers de
            templates e acabam usando um motor de template alternativo.
            <span class="classname">Zend_View</span> fornece para isso dois mecanismos, o primeiro através
            de scripts de visualização, e o segundo implementando
            <span class="classname">Zend_View_Interface</span>.
        </p>

        <div class="section" id="zend.view.scripts.templates.scripts"><div class="info"><h1 class="title">Sistemas de Template Usando Scripts de Visualização</h1></div>
            

            <p class="para">
                Um script de visualização pode ser usado para instanciar e manipular um objeto de
                template separado, como um template do PHPLIB. O script de visualização para esse
                tipo de atividade pode ser algo como isto:
            </p>

            <pre class="programlisting brush: php">
include_once &#039;template.inc&#039;;
$tpl = new Template();

if ($this-&gt;books) {
    $tpl-&gt;setFile(array(
        &quot;booklist&quot; =&gt; &quot;booklist.tpl&quot;,
        &quot;eachbook&quot; =&gt; &quot;eachbook.tpl&quot;,
    ));

    foreach ($this-&gt;books as $key =&gt; $val) {
        $tpl-&gt;set_var(&#039;author&#039;, $this-&gt;escape($val[&#039;author&#039;]);
        $tpl-&gt;set_var(&#039;title&#039;, $this-&gt;escape($val[&#039;title&#039;]);
        $tpl-&gt;parse(&quot;books&quot;, &quot;eachbook&quot;, true);
    }

    $tpl-&gt;pparse(&quot;output&quot;, &quot;booklist&quot;);
} else {
    $tpl-&gt;setFile(&quot;nobooks&quot;, &quot;nobooks.tpl&quot;)
    $tpl-&gt;pparse(&quot;output&quot;, &quot;nobooks&quot;);
}
</pre>


            <p class="para">
                Estes seriam os arquivos de template relacionados:
            </p>

            <pre class="programlisting brush: html">
&lt;!-- booklist.tpl --&gt;
&lt;table&gt;
    &lt;tr&gt;
        &lt;th&gt;Autor&lt;/th&gt;
        &lt;th&gt;Título&lt;/th&gt;
    &lt;/tr&gt;
    {books}
&lt;/table&gt;

&lt;!-- eachbook.tpl --&gt;
    &lt;tr&gt;
        &lt;td&gt;{author}&lt;/td&gt;
        &lt;td&gt;{title}&lt;/td&gt;
    &lt;/tr&gt;

&lt;!-- nobooks.tpl --&gt;
&lt;p&gt;Não existem livros a serem exibidos.&lt;/p&gt;
</pre>

        </div>

        <div class="section" id="zend.view.scripts.templates.interface"><div class="info"><h1 class="title">Sistemas de Template Usando Zend_View_Interface</h1></div>
            

            <p class="para">
                Alguns podem achar mais fácil simplesmente fornecer um sistema de template
                compatível com <span class="classname">Zend_View</span>.
                <span class="classname">Zend_View_Interface</span> define a interface mínima necessária para
                a compatibilidade:
            </p>

            <pre class="programlisting brush: php">
/**
 * Return the actual template engine object
 */
public function getEngine();

/**
 * Set the path to view scripts/templates
 */
public function setScriptPath($path);

/**
 * Set a base path to all view resources
 */
public function setBasePath($path, $prefix = &#039;Zend_View&#039;);

/**
 * Add an additional base path to view resources
 */
public function addBasePath($path, $prefix = &#039;Zend_View&#039;);

/**
 * Retrieve the current script paths
 */
public function getScriptPaths();

/**
 * Overloading methods for assigning template variables as object
 * properties
 */
public function __set($key, $value);
public function __isset($key);
public function __unset($key);

/**
 * Manual assignment of template variables, or ability to assign
 * multiple variables en masse.
 */
public function assign($spec, $value = null);

/**
 * Unset all assigned template variables
 */
public function clearVars();

/**
 * Render the template named $name
 */
public function render($name);
</pre>


            <p class="para">
                Usando essa interface, torna-se relativamente fácil envolver um sistema de template
                de terceiro como uma classe compatível com <span class="classname">Zend_View</span>. Como
                exemplo, o seguinte é um potencial envoltório para Smarty:
            </p>

            <pre class="programlisting brush: php">
class Zend_View_Smarty implements Zend_View_Interface
{
    /**
     * Smarty object
     * @var Smarty
     */
    protected $_smarty;

    /**
     * Constructor
     *
     * @param string $tmplPath
     * @param array $extraParams
     * @return void
     */
    public function __construct($tmplPath = null, $extraParams = array())
    {
        $this-&gt;_smarty = new Smarty;

        if (null !== $tmplPath) {
            $this-&gt;setScriptPath($tmplPath);
        }

        foreach ($extraParams as $key =&gt; $value) {
            $this-&gt;_smarty-&gt;$key = $value;
        }
    }

    /**
     * Return the template engine object
     *
     * @return Smarty
     */
    public function getEngine()
    {
        return $this-&gt;_smarty;
    }

    /**
     * Set the path to the templates
     *
     * @param string $path The directory to set as the path.
     * @return void
     */
    public function setScriptPath($path)
    {
        if (is_readable($path)) {
            $this-&gt;_smarty-&gt;template_dir = $path;
            return;
        }

        throw new Exception(&#039;Invalid path provided&#039;);
    }

    /**
     * Retrieve the current template directory
     *
     * @return string
     */
    public function getScriptPaths()
    {
        return array($this-&gt;_smarty-&gt;template_dir);
    }

    /**
     * Alias for setScriptPath
     *
     * @param string $path
     * @param string $prefix Unused
     * @return void
     */
    public function setBasePath($path, $prefix = &#039;Zend_View&#039;)
    {
        return $this-&gt;setScriptPath($path);
    }

    /**
     * Alias for setScriptPath
     *
     * @param string $path
     * @param string $prefix Unused
     * @return void
     */
    public function addBasePath($path, $prefix = &#039;Zend_View&#039;)
    {
        return $this-&gt;setScriptPath($path);
    }

    /**
     * Assign a variable to the template
     *
     * @param string $key The variable name.
     * @param mixed $val The variable value.
     * @return void
     */
    public function __set($key, $val)
    {
        $this-&gt;_smarty-&gt;assign($key, $val);
    }

    /**
     * Allows testing with empty() and isset() to work
     *
     * @param string $key
     * @return boolean
     */
    public function __isset($key)
    {
        return (null !== $this-&gt;_smarty-&gt;get_template_vars($key));
    }

    /**
     * Allows unset() on object properties to work
     *
     * @param string $key
     * @return void
     */
    public function __unset($key)
    {
        $this-&gt;_smarty-&gt;clear_assign($key);
    }

    /**
     * Assign variables to the template
     *
     * Allows setting a specific key to the specified value, OR passing
     * an array of key =&gt; value pairs to set en masse.
     *
     * @see __set()
     * @param string|array $spec The assignment strategy to use (key or
     * array of key =&gt; value pairs)
     * @param mixed $value (Optional) If assigning a named variable,
     * use this as the value.
     * @return void
     */
    public function assign($spec, $value = null)
    {
        if (is_array($spec)) {
            $this-&gt;_smarty-&gt;assign($spec);
            return;
        }

        $this-&gt;_smarty-&gt;assign($spec, $value);
    }

    /**
     * Clear all assigned variables
     *
     * Clears all variables assigned to Zend_View either via
     * {@link assign()} or property overloading
     * ({@link __get()}/{@link __set()}).
     *
     * @return void
     */
    public function clearVars()
    {
        $this-&gt;_smarty-&gt;clear_all_assign();
    }

    /**
     * Processes a template and returns the output.
     *
     * @param string $name The template to process.
     * @return string The output.
     */
    public function render($name)
    {
        return $this-&gt;_smarty-&gt;fetch($name);
    }
}
</pre>


            <p class="para">
                Neste exemplo, você poderia instanciar a classe
                <span class="classname">Zend_View_Smarty</span> em vez de <span class="classname">Zend_View</span>,
                e então usá-la aproximadamente da mesma maneira que
                <span class="classname">Zend_View</span>:
            </p>

            <pre class="programlisting brush: php">
//Example 1. In initView() of initializer.
$view = new Zend_View_Smarty(&#039;/path/to/templates&#039;);
$viewRenderer =
    Zend_Controller_Action_HelperBroker::getStaticHelper(&#039;ViewRenderer&#039;);
$viewRenderer-&gt;setView($view)
             -&gt;setViewBasePathSpec($view-&gt;_smarty-&gt;template_dir)
             -&gt;setViewScriptPathSpec(&#039;:controller/:action.:suffix&#039;)
             -&gt;setViewScriptPathNoControllerSpec(&#039;:action.:suffix&#039;)
             -&gt;setViewSuffix(&#039;tpl&#039;);

//Example 2. Usage in action controller remains the same...
class FooController extends Zend_Controller_Action
{
    public function barAction()
    {
        $this-&gt;view-&gt;book   = &#039;Zend PHP 5 Certification Study Guide&#039;;
        $this-&gt;view-&gt;author = &#039;Davey Shafik and Ben Ramsey&#039;
    }
}

//Example 3. Initializing view in action controller
class FooController extends Zend_Controller_Action
{
    public function init()
    {
        $this-&gt;view   = new Zend_View_Smarty(&#039;/path/to/templates&#039;);
        $viewRenderer = $this-&gt;_helper-&gt;getHelper(&#039;viewRenderer&#039;);
        $viewRenderer-&gt;setView($this-&gt;view)
                     -&gt;setViewBasePathSpec($view-&gt;_smarty-&gt;template_dir)
                     -&gt;setViewScriptPathSpec(&#039;:controller/:action.:suffix&#039;)
                     -&gt;setViewScriptPathNoControllerSpec(&#039;:action.:suffix&#039;)
                     -&gt;setViewSuffix(&#039;tpl&#039;);
    }
</pre>

        </div>
    </div>
</div>
        <hr />

            <table width="100%">
                <tr>
                    <td width="25%" style="text-align: left;">
                    <a href="zend.view.controllers.html">Scripts Controladores</a>
                    </td>

                    <td width="50%" style="text-align: center;">
                        <div class="up"><span class="up"><a href="zend.view.html">Zend_View</a></span><br />
                        <span class="home"><a href="manual.html">Guia de Refer&ecirc;ncia do Programador</a></span></div>
                    </td>

                    <td width="25%" style="text-align: right;">
                        <div class="next" style="text-align: right; float: right;"><a href="zend.view.helpers.html">Assistentes de Visualiza&ccedil;&atilde;o</a></div>
                    </td>
                </tr>
            </table>
</td>
        <td style="font-size: smaller;" width="15%"> <style type="text/css">
#leftbar {
	float: left;
	width: 186px;
	padding: 5px;
	font-size: smaller;
}
ul.toc {
	margin: 0px 5px 5px 5px;
	padding: 0px;
}
ul.toc li {
	font-size: 85%;
	margin: 1px 0 1px 1px;
	padding: 1px 0 1px 11px;
	list-style-type: none;
	background-repeat: no-repeat;
	background-position: center left;
}
ul.toc li.header {
	font-size: 115%;
	padding: 5px 0px 5px 11px;
	border-bottom: 1px solid #cccccc;
	margin-bottom: 5px;
}
ul.toc li.active {
	font-weight: bold;
}
ul.toc li a {
	text-decoration: none;
}
ul.toc li a:hover {
	text-decoration: underline;
}
</style>
 <ul class="toc">
  <li class="header home"><a href="manual.html">Guia de Refer&ecirc;ncia do Programador</a></li>
  <li class="header up"><a href="manual.html">Guia de Refer&ecirc;ncia do Programador</a></li>
  <li class="header up"><a href="reference.html">Refer&ecirc;ncia do Zend Framework</a></li>
  <li class="header up"><a href="zend.view.html">Zend_View</a></li>
  <li><a href="zend.view.introduction.html">Introdu&ccedil;&atilde;o</a></li>
  <li><a href="zend.view.controllers.html">Scripts Controladores</a></li>
  <li class="active"><a href="zend.view.scripts.html">Scripts de Visualiza&ccedil;&atilde;o</a></li>
  <li><a href="zend.view.helpers.html">Assistentes de Visualiza&ccedil;&atilde;o</a></li>
  <li><a href="zend.view.abstract.html">Zend_View_Abstract</a></li>
 </ul>
 </td>
    </tr>
</table>

<script type="text/javascript" src="../js/shCore.js"></script>
<script type="text/javascript" src="../js/shAutoloader.js"></script>
<script type="text/javascript" src="../js/main.js"></script>

</body>
</html>